package xyz.heyaoshare.common.entity.bo;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import xyz.heyaoshare.exceptions.code.ErrorCode;

import java.io.Serial;
import java.io.Serializable;

import static xyz.heyaoshare.exceptions.code.ErrorInfo.SERVER_ERROR;
import static xyz.heyaoshare.exceptions.code.ErrorInfo.SUCCESS;

/**
 * 统一结果返回类
 * @author YueHe
 * @version 0.0.1
 * @since 2025/6/25 上午10:20
 */
@Data
@AllArgsConstructor
@Schema(description = "统一返回类")
public class Result<T> implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    @Schema(description = "状态码")
    private Integer code;

    @Schema(description = "返回消息")
    private String message;

    @Schema(description = "返回数据")
    private T data;

    private Result() {
    }

    /**
     * 返回成功的响应
     *
     * @param <T> 泛型参数
     * @return R<T> 类型的响应对象
     */
    public static <T> Result<T> ok() {
        return new Result<T>().setCode(SUCCESS.getCode()).setMessage("success").setData(null);
    }

    /**
     * 返回一个状态为成功响应对象
     *
     * @param <T> 泛型参数，表示响应数据的类型
     * @param data 响应数据
     * @return 响应对象，包含状态和响应数据
     */
    public static <T> Result<T> ok(T data) {
        return new Result<T>().setMessage("success").setCode(SUCCESS.getCode()).setData(data);
    }

    /**
     * 返回一个错误响应。
     *
     * @param <T> 泛型类型，通常表示响应数据的类型。
     * @return 返回一个包含错误代码的R对象。
     */
    public static <T> Result<T> error() {
        return new Result<>(SERVER_ERROR.getCode(), SERVER_ERROR.getMessage(), null);
    }

    /**
     * 返回一个表示错误的响应对象。
     *
     * @param <T> 响应对象的泛型类型
     * @param message 错误信息
     * @return 表示错误的响应对象
     */
    public static <T> Result<T> error(String message) {
        return new Result<>(SERVER_ERROR.getCode(), message, null);
    }

    /**
     * 创建一个包含错误信息的响应对象。
     *
     * @param code 错误码
     * @param message 错误信息
     * @param <T> 泛型类型，代表响应对象的泛型类型
     * @return 一个包含错误信息的响应对象
     */
    public static <T> Result<T> error(int code, String message) {
        return new Result<>(code, message, null);
    }

    /**
     * 返回一个包含错误信息的R对象。
     *
     * @param <T> 类型参数，R对象中的泛型类型
     * @param errorInfo 错误信息，类型为ErrorCode
     * @return 包含错误信息的R对象
     */
    public static <T> Result<T> error(ErrorCode errorInfo) {
        return new Result<>(errorInfo.getCode(), errorInfo.getMessage(), null);
    }

}